Наполовину открытые соединения и другие аномалии

Уже установившееся соединение называется "наполовину открытым", если одна из программ TCPM закрыла соединение, или отказалась от него. Причем сделала это на своем конце, не предупредив своего партнера. Также такая ситуация может возникнуть, если нарушена синхронизация на концах линии вследствие сбоя, приведшего к потере информации в памяти. Если на таких соединениях делается попытка отправить данные в каком-либо направлении, то автоматически производится перезагрузка соединения. Однако предполагается, что наполовину открытые соединения являются редкостью, а процедура восстановления применяется в сети весьма умеренно.

Если на конце A соединение считается уже несуществующим, а клиент на конце B пытается послать данные, то это приведет к тому, что программа TCP на конце B получит контрольное сообщение о перезагрузке. Такое сообщение показывает программе TCP на конце B, что что-то неправильно и ей предлагается ликвидировать это соединение.

Предположим, что два клиента в точках A и B общаются друг с другом, и в этот момент происходит крах, приводящий к потере информации в памяти у программы TCP на конце A. В зависимости от операционной системы, обслуживающей программу TCP A, вероятно, будет задействован некий механизм исправления ошибки. Когда программа TCP A будет запущена вновь, она, вероятно, вновь начнет свою работу с самого начала или же с инструкции преодоления сбоя. В результате, программа A, вероятно, попытается открыть (OPEN) соединение или послать информацию (SEND) через соединение, которое, как она полагает, является открытым. В последнем случае от местной программы TCP (на конце A) будет получено сообщение "соединение не открыто". При попытке установить соединение программа TCP A будет посылать сегмент, содержащий сигнал SYN. Такой сценарий приводит к ситуации, показанной на рисунке 10. После того, как программа TCP A потерпит крах, пользователь попытается повторно открыть соединение. Программа TCP B тем временем продолжает полагать, будто соединение остается открытым.

Обнаружение наполовину открытого соединения

Когда на строке 3 сигнал SYN достигает программу TCP B, находящуюся в синхронизированном состоянии, а пришедший сегмент находится за пределами окна, программа TCP B отвечает на это его подтверждением, показывает номер очереди, который она желает получить (ACK=100). Программа TCP A, видя, что сегмент на строке 4 не подтвердил отправленную ею информацию, фиксирует отсутствие синхронизации и посылает сигнал перезагрузки (RST), поскольку обнаружено, что соединение является открытым наполовину. На строке 5 программа TCP B ликвидирует соединение. Программа TCP A будет продолжать попытки установить соединение.

Теперь возникшая проблема решается простым подтверждением трех путей

Другой интересный сюжет имеет место, если программа TCP A терпит крах, а программа TCP B, полагая, что находится в состоянии синхронизации, пытается послать данные. Эта ситуация показана на рисунке. В этом случае данные, отправленные программой TCP B, и пришедшие на программу TCP A (строка 2). будут отвергнуты, поскольку используемого ими соединения не существует. На основании этого программа TCP A посылает сигнал RST. Как только сигнал RST принят программой TCP B, он будет рассмотрен, а использованное прежде соединение будет ликвидировано.

Активная сторона приводит к обнаружению наполовину открытого соединения

На рисунке ниже показано, что две программы TCP – A и B - ,имея пассивное состояние, ждут сигнала SYN. Старый дубликат сигнала, достигает программу TCP B (строка 2), запускает ее. Возвращается сигнал SYN-ACK (строка 3) и заставляет программу TCP A генерировать сигнал RST (на строке 3 сигнал ACK неприемлем). Программа TCP B принимает команду перезагрузки и возвращается в пассивное состояние LISTEN.

Старый дубликат сигнала SYN инициирует перезагрузку на двух пассивных сокетах.

Может быть множество других вариаций, которые могут быть объяснены нижеописанными правилами для создания и обработки сигналов RST.

Hosted by uCoz